home *** CD-ROM | disk | FTP | other *** search
- static char calcdate_prog[] = "@(#)char *calcdate(char *dat,long diff,char *ergdat) - Datum +/- Zahl";
- static char calcdate_ver[] = "@(#)v1.10/kr ; 20.05.91";
- /* calcdate Rechnen mit Datum
- **
- ** Autor Klaus Rath
- **
- ** Deklaration char *calcdate(char *datum, long abstand, char *erg);
- **
- ** Übergabe Die Funktion erwartet einen String in einem der folgenden
- ** Formate :
- ** tt.mm.[[jj]jj] -- Deutsches Format
- ** mm/tt[/[jj]jj] -- Amerikanisches Format
- ** [jj]jjmmtt -- Datenbankformat DDB/4
- ** sowie einen long-Wert, dessen Vorzeichen die gewünschte
- ** Operation festlegt.
- ** Rückgabe Zeiger auf ein char-Array erg, daß ausreichend dimensioniert
- ** sein muß - calcdate gibt immer im langen Format zurück.
- ** Für deutsches und amerikanisches Format werden also 11,
- ** fürs DDB/4-Format 9 Zeichen benötigt!
- **
- ** Anmerkungen Die Funktion berücksichtigt vollständig Schaltjahre - durch
- ** Aufruf der Funktion 'int schalt_jahr(int jahr)', die dem-
- ** entsprechend mit eingebunden werden muß.
- ** Sollte kein Jahrhundert im Übergabestring angegeben worden
- ** sein, ermittelt die Funktion das Default-Jahrhundert aus
- ** der Systemzeit !
- ** Der Bereich, in dem calcdate arbeiten kann, liegt
- ** zwischen dem 01.01.0000 und dem 31.12.9999 !!!
- ** Änderungen 1.00 ; 13.04.91
- ** Erste vollwertige Version
- ** 1.10 ; 20.05.91
- ** Anpassung an die Formate tt.mm. und mm/tt, die beide
- ** eine Vorbelegung auch des aktuellen Jahres benötigen.
- */
-
- #include <stdio.h>
- #include <string.h>
- #include <time.h>
- #ifdef __TURBOC__
- #define ANSI
- #define MSDOS
- #include <stdlib.h>
- #include <sys\types.h>
- #else
- #include <sys/types.h>
- #endif
- #include "datum.h"
-
- #ifdef ANSI
- char *calcdate(char *dstring, long abstand, char *erg)
- #else
- char *calcdate(dstring,abstand,erg)
- char *dstring;
- long abstand;
- char *erg;
- #endif
- {
- char tag_s[3],monat_s[3],jahr_s[3],jh_s[3];
- int tag_z, monat_z, jahr_z, jh_z, jahreszahl;
- int format;
- char systemzeit_s[26];
- time_t systemzeit;
- int schaltj_jn;
- int zaehler;
- int day_of_year = 0;
- int rest_of_year = 0;
- #ifdef __TURBOC__
- int mlaen[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
- #else
- int mlaen[13];
- mlaen[0] = 0;
- mlaen[1] = 31;
- mlaen[2] = 28;
- mlaen[3] = 31;
- mlaen[4] = 30;
- mlaen[5] = 31;
- mlaen[6] = 30;
- mlaen[7] = 31;
- mlaen[8] = 31;
- mlaen[9] = 30;
- mlaen[10] = 31;
- mlaen[11] = 30;
- mlaen[12] = 31;
- #endif
-
- /* Überprüfung auf Gültigkeit bzw. Format :
- */
- format = checkdate(dstring);
- if ( !format ) {
- strcpy(erg,(char *)FALSE);
- return(erg);
- }
-
- /* Jahrhundert und Jahr aus der Systemzeit ermitteln und vorbelegen :
- */
- time(&systemzeit);
- strcpy(systemzeit_s,ctime(&systemzeit));
- jh_s[0] = systemzeit_s[20];
- jh_s[1] = systemzeit_s[21];
- jh_s[2] = '\0';
- jahr_s[0] = systemzeit_s[22];
- jahr_s[1] = systemzeit_s[23];
- jahr_s[2] = '\0';
-
- /* Format überprüfen und umkopieren :
- */
- if ( format == 1 || format == 2 || format == 7 ) { /* deutsches Format */
- tag_s[0] = dstring[0];
- tag_s[1] = dstring[1];
- tag_s[2] = '\0';
- monat_s[0] = dstring[3];
- monat_s[1] = dstring[4];
- monat_s[2] = '\0';
- if ( format == 2 ) {
- jh_s[0] = dstring[6];
- jh_s[1] = dstring[7];
- jh_s[2] = '\0';
- jahr_s[0] = dstring[8];
- jahr_s[1] = dstring[9];
- jahr_s[2] = '\0';
- }
- else if ( format == 1 ) {
- jahr_s[0] = dstring[6];
- jahr_s[1] = dstring[7];
- jahr_s[2] = '\0';
- }
- } /* ENDE: Deutsches Format */
- else if ( format == 3 || format == 4 || format == 8 ) { /* am.Format */
- tag_s[0] = dstring[3];
- tag_s[1] = dstring[4];
- tag_s[2] = '\0';
- monat_s[0] = dstring[0];
- monat_s[1] = dstring[1];
- monat_s[2] = '\0';
- if ( format == 4 ) {
- jh_s[0] = dstring[6];
- jh_s[1] = dstring[7];
- jh_s[2] = '\0';
- jahr_s[0] = dstring[8];
- jahr_s[1] = dstring[9];
- jahr_s[2] = '\0';
- }
- else if ( format == 3 ) {
- jahr_s[0] = dstring[6];
- jahr_s[1] = dstring[7];
- jahr_s[2] = '\0';
- }
- } /* ENDE: Amerikanisches Format */
- else if ( format == 5 || format == 6 ) { /* Datenbank-Format */
- if ( format == 6 ) {
- jh_s[0] = dstring[0];
- jh_s[1] = dstring[1];
- jh_s[2] = '\0';
- jahr_s[0] = dstring[2];
- jahr_s[1] = dstring[3];
- jahr_s[2] = '\0';
- tag_s[0] = dstring[6];
- tag_s[1] = dstring[7];
- tag_s[2] = '\0';
- monat_s[0] = dstring[4];
- monat_s[1] = dstring[5];
- monat_s[2] = '\0';
- }
- else {
- jahr_s[0] = dstring[0];
- jahr_s[1] = dstring[1];
- jahr_s[2] = '\0';
- tag_s[0] = dstring[4];
- tag_s[1] = dstring[5];
- tag_s[2] = '\0';
- monat_s[0] = dstring[2];
- monat_s[1] = dstring[3];
- monat_s[2] = '\0';
- }
- } /* ENDE: Datenbankformat */
- /* ENDE:if(Formatprüfung und Kopierung) */
-
- /* Konvertierung :
- */
- jh_z = atoi(jh_s);
- jahr_z = atoi(jahr_s);
- monat_z = atoi(monat_s);
- tag_z = atoi(tag_s);
- jahreszahl = (jh_z*100) + jahr_z;
-
- /* Tag des übergebenen Jahres ermitteln :
- */
- if ( ( schaltj_jn = schalt_jahr(jahreszahl) ) )
- mlaen[2] = 29;
- day_of_year += tag_z;
-
- for ( zaehler = monat_z - 1 ; zaehler > 0 ; zaehler-- )
- day_of_year += mlaen[zaehler];
- if ( schaltj_jn )
- rest_of_year = 366 - day_of_year;
- else
- rest_of_year = 365 - day_of_year;
-
- /* Rückgabeformat auf das passende Langformat einstellen :
- */
- switch ( format ) {
-
- case 1:
- case 2:
- case 7: format = 2;
- break;
- case 3:
- case 4:
- case 8: format = 4;
- break;
- case 5:
- case 6: format = 6;
- break;
- default: format = 2;
- }
-
- /* Aktion ermitteln :
- */
- if ( abstand == 0 ) {
- strcpy(erg,dstring);
- return(erg);
- }
- else if ( abstand > 0 ) { /* Addition */
- /* Sonderfall : aktueller Monat :
- */
- if ( abstand <= mlaen[monat_z] - tag_z ) { /* im aktuellen Monat */
- strcpy(erg,mk_datestr(tag_z+(int)abstand,monat_z,jahreszahl,format));
- return(erg);
- }
- /* Sonderfall : aktuelles Jahr :
- */
- if ( abstand <= rest_of_year ) {
- abstand -= (mlaen[monat_z] - tag_z);
- for ( zaehler = monat_z+1 ; abstand > mlaen[zaehler] ; zaehler++)
- abstand -= mlaen[zaehler];
- if ( zaehler == 13 ) {
- zaehler = 1;
- }
- strcpy(erg,mk_datestr((int)abstand,zaehler,jahreszahl,format));
- return(erg);
- }
- while ( abstand > 0 ) {
- abstand -= rest_of_year;
- jahreszahl++;
- if ( schalt_jahr(jahreszahl) ) {
- rest_of_year = 366;
- mlaen[2] = 29;
- }
- else {
- rest_of_year = 365;
- mlaen[2] = 28;
- }
- if ( abstand <= rest_of_year ) {
- for ( zaehler = 1 ; abstand > mlaen[zaehler] ; zaehler++ )
- abstand -= mlaen[zaehler];
- if ( zaehler == 13 )
- zaehler = 1;
- strcpy(erg,mk_datestr((int)abstand,zaehler,jahreszahl,format));
- return(erg);
- }
- } /* ENDE: while(abstand) */
- } /* ENDE: abstand > 0 */
- else if ( abstand < 0 ) { /* Subtraktion */
- abstand = abstand*(-1);
- /* Sonderfall : aktueller Monat :
- */
- if ( abstand < tag_z ) { /* im aktuellen Monat */
- strcpy(erg,mk_datestr(tag_z-(int)abstand,monat_z,jahreszahl,format));
- return(erg);
- }
- /* Sonderfall : aktuelles Jahr :
- */
- if ( abstand < day_of_year ) {
- abstand -= tag_z;
- for ( zaehler = monat_z-1 ; abstand > mlaen[zaehler] ; zaehler--)
- abstand -= mlaen[zaehler];
- abstand = mlaen[zaehler] - abstand;
- if ( zaehler == 0 ) {
- zaehler = 12;
- }
- strcpy(erg,mk_datestr((int)abstand,zaehler,jahreszahl,format));
- return(erg);
- }
- /* Ansonsten : über die Jahreswende zurück :
- */
- while ( abstand > 0 ) {
- abstand -= day_of_year;
- jahreszahl--;
- if ( schalt_jahr(jahreszahl) ) {
- day_of_year = 366;
- mlaen[2] = 29;
- }
- else {
- day_of_year = 365;
- mlaen[2] = 28;
- }
- if ( abstand < day_of_year ) {
- for ( zaehler = 12 ; abstand >= mlaen[zaehler] ; zaehler-- )
- abstand -= mlaen[zaehler];
- abstand = mlaen[zaehler] - abstand;
- if ( zaehler == 0 )
- zaehler = 12;
- strcpy(erg,mk_datestr((int)abstand,zaehler,jahreszahl,format));
- return(erg);
- }
- } /* ENDE: while(abstand) */
- } /* ENDE: abstand > 0 */
-
- return(NULL);
- } /* ENDE: calcdate() */
-